Veraltete und überholte Funktionen
Diese Seite listet JavaScript-Funktionen auf, die veraltet sind (d.h. noch verfügbar, aber zur Entfernung vorgesehen) und überholt (d.h. nicht mehr nutzbar).
Veraltete Funktionen
Diese veralteten Funktionen können noch verwendet werden, sollten jedoch mit Vorsicht eingesetzt werden, da sie nicht von jeder JavaScript-Engine implementiert werden müssen. Sie sollten daran arbeiten, deren Verwendung aus Ihrem Code zu entfernen.
Einige dieser veralteten Funktionen sind im Anhang B der ECMAScript-Spezifikation aufgelistet. Dieser Abschnitt wird als normativ optional beschrieben — das heißt, Webbrowser-Hosts müssen diese Funktionen implementieren, während Nicht-Web-Hosts dies möglicherweise nicht tun. Diese Funktionen sind wahrscheinlich stabil, da ihre Entfernung Rückwärtskompatibilitätsprobleme verursachen und ältere Websites beschädigen würde. (JavaScript hat das Designziel "Das Web nicht zerstören".) Dennoch sind sie nicht plattformübergreifend portabel und werden möglicherweise nicht von allen Analysetools unterstützt, daher wird empfohlen, sie nicht zu verwenden, wie in der Einleitung zu Anhang B angegeben:
… Alle in diesem Anhang spezifizierten Sprachfeatures und Verhaltensweisen haben eine oder mehrere unerwünschte Eigenschaften und würden ohne die Existenz älterer Nutzungen aus dieser Spezifikation entfernt werden. …
… Programmierer sollten diese Features und Verhaltensweisen bei der Erstellung neuen ECMAScript-Codes weder verwenden noch deren Existenz annehmen. …
Einige andere, obwohl im Hauptteil der Spezifikation, sind ebenfalls als normativ optional gekennzeichnet und sollten nicht darauf aufgebaut werden.
HTML-Kommentare
JavaScript-Quellcode, wenn er als Skripte geparst wird, erlaubt HTML-ähnliche Kommentare, als ob das Skript Teil eines <script>
-Tags wäre.
Der folgende Code ist gültiges JavaScript, wenn es in einem Webbrowser (oder Node.js, das die V8-Engine von Chrome nutzt) ausgeführt wird:
<!-- comment
console.log("a"); <!-- another comment
console.log("b");
--> More comment
// Logs "a" and "b"
<!--
und -->
verhalten sich beide wie //
, d.h. sie starten Zeilenkommentare. -->
ist nur am Zeilenanfang gültig (um Mehrdeutigkeit mit einem Postfix-Dekrement, gefolgt von einem Größer-als-Operator zu vermeiden), während <!--
überall in der Zeile vorkommen kann.
RegExp
Die folgenden Eigenschaften sind veraltet. Dies beeinflusst nicht ihre Verwendung in Ersetzungs-Strings:
$1–$9
-
Parenthesierte Substring-Übereinstimmungen, falls vorhanden.
input
,$_
-
Der String, gegen den ein regulärer Ausdruck abgeglichen wird.
lastMatch
,$&
-
Der zuletzt abgeglichene Substring.
lastParen
,$+
-
Die letzte parenthesierte Substring-Übereinstimmung, falls vorhanden.
leftContext
,$`
-
Der Substring vor der letzten Übereinstimmung.
rightContext
,$'
-
Der Substring nach der letzten Übereinstimmung.
Warnung: Vermeiden Sie die Verwendung dieser statischen Eigenschaften, da sie Probleme bei der Interaktion mit externem Code verursachen können!
Die compile()
-Methode ist veraltet. Erstellen Sie stattdessen eine neue RegExp
-Instanz.
Die folgenden regulären Ausdrucks-Syntaxen sind veraltet und nur im Unicode-unuptächtigen Modus verfügbar. Im Unicode-bewussten Modus sind sie alle Syntaxfehler:
- Lookahead-Behauptungen können Quantoren haben.
- Rückverweise, die sich nicht auf eine bestehende erfasste Gruppe beziehen, werden zu Legacy-Oktal-Escapes.
- In Zeichenklassen, bei denen eine Grenze eine Zeichenklasse ist, wird das
-
zu einem literalen Charakter. - Eine nicht erkannte Escape-Sequenz wird zu einem "Identity Escape".
- Escape-Sequenzen innerhalb von Zeichenklassen der Form
\cX
, wobeiX
eine Zahl oder_
ist, werden auf die gleiche Weise wie diejenigen mit ASCII-Buchstaben dekodiert:\c0
ist dasselbe wie\cP
, wenn modulo 32 berechnet wird. Außerdem wird, wenn die Form\cX
angetroffen wird, woX
nicht zu den anerkannten Zeichen gehört, das Backslash als ein literales Zeichen behandelt. - Die Sequenz
\k
innerhalb eines regulären Ausdrucks, der keine benannten erfassten Gruppen hat, wird als Identity Escape behandelt. - Die Syntaxzeichen
]
,{
, und}
können buchstäblich erscheinen, ohne dass sie entkommen müssen, wenn sie nicht als Ende einer Zeichenklasse oder Quantifizierer-Delimiter interpretiert werden können.
Funktion
- Die
caller
-Eigenschaft von Funktionen und diearguments.callee
-Eigenschaft sind veraltet und im Strict-Modus nicht verfügbar. - Anstelle von
arguments
als Eigenschaft einer Funktion zuzugreifen, sollten Sie dasarguments
-Objekt innerhalb von Funktionsclosure verwenden.
Objekt
- Die Accessoren
Object.prototype.__proto__
sind veraltet. Verwenden Sie stattdessenObject.getPrototypeOf
undObject.setPrototypeOf
. Dies gilt nicht für den__proto__
-Literal-Schlüssel in Objektliteralen. - Die Methoden
Object.prototype.__defineGetter__
,Object.prototype.__defineSetter__
,Object.prototype.__lookupGetter__
, undObject.prototype.__lookupSetter__
sind veraltet. Verwenden Sie stattdessenObject.getOwnPropertyDescriptor
undObject.defineProperty
.
String
- HTML-Wrapper-Methoden wie
String.prototype.fontsize
undString.prototype.big
. String.prototype.substr
wird wahrscheinlich nicht so bald entfernt, ist aber in Anhang B definiert und daher normativ optional.String.prototype.trimLeft
undString.prototype.trimRight
sollten durchString.prototype.trimStart
undString.prototype.trimEnd
ersetzt werden.
Datum
- Die Methoden
getYear()
undsetYear()
sind vom Jahr-2000-Problem betroffen und wurden durchgetFullYear
undsetFullYear
ersetzt. - Die
toGMTString()
-Methode ist veraltet. Verwenden Sie stattdessentoUTCString()
.
Escape-Sequenzen
- Oktale Escape-Sequenzen (\ gefolgt von ein, zwei oder drei Oktalzahlen) sind im String- und regulären Ausdruck-Literalen veraltet.
- Die Funktionen
escape()
undunescape()
sind veraltet. Verwenden SieencodeURI()
,encodeURIComponent()
,decodeURI()
oderdecodeURIComponent()
, um Escape-Sequenzen für Sonderzeichen zu enkodieren und zu dekodieren.
Anweisungen
Die with
-Anweisung ist veraltet und im Strict-Modus nicht verfügbar.
Initialisierer in var
-Deklarationen von for...in
-Schleifenheadern sind veraltet und erzeugen Syntaxfehler im Strict-Modus. Der Initialisierungsausdruck wird ausgewertet und der Variable zugewiesen, aber der Wert würde sofort bei der ersten Iteration der Schleife erneut zugewiesen.
Normalerweise kann der catch
-Block einer try...catch
-Anweisung keine Variablendeklaration enthalten, die denselben Namen wie die im catch()
gebundenen Variablen hat. Eine Erweiterungsgrammatik erlaubt, dass der catch
-Block eine var
-deklarierte Variable mit demselben Namen wie der im catch
gebundene Bezeichner enthält, aber nur, wenn die catch
-Bindung ein einfacher Bezeichner und kein Destrukturierungsmuster ist. Diese Variableninitialisierung und -zuweisung würde jedoch nur auf den im catch
gebundenen Bezeichner wirken, statt auf die Variable des oberen Scopes, und das Verhalten könnte verwirrend sein.
var a = 2;
try {
throw new Error();
} catch (a) {
var a = 1; // This 1 is assigned to the caught `a`, not the outer `a`.
}
console.log(a); // 2
try {
throw new Error();
// Note: identifier changed to `err` to avoid conflict with
// the inner declaration of `a`.
} catch (err) {
var a = 1; // This 1 is assigned to the upper-scope `a`.
}
console.log(a); // 1
Dies ist im Anhang B der Spezifikation aufgeführt und kann daher nicht überall implementiert werden. Vermeiden Sie Namenskonflikte zwischen dem im catch
gebundenen Bezeichner und den im catch
-Block deklarierten Variablen.
Überholte Funktionen
Diese überholten Funktionen wurden vollständig aus JavaScript entfernt und können ab der angegebenen Version von JavaScript nicht mehr verwendet werden.
RegExp
Die folgenden sind jetzt Eigenschaften von RegExp
-Instanzen und nicht mehr des RegExp
-Konstruktors:
Eigenschaft | Beschreibung |
---|---|
global |
Ob der reguläre Ausdruck gegen alle möglichen Übereinstimmungen in einem String getestet werden soll oder nur gegen die erste. |
ignoreCase |
Ob bei dem Versuch, eine Übereinstimmung in einem String zu finden, die Groß- und Kleinschreibung ignoriert werden soll. |
lastIndex |
Der Index, an dem die nächste Übereinstimmung begonnen wird. |
multiline (auch über RegExp.$* ) |
Ob nach Übereinstimmungen in Strings über mehrere Zeilen hinweg gesucht werden soll. |
source |
Der Text des Musters. |
Die valueOf()
-Methode ist nicht mehr speziell für RegExp
. Sie verwendet Object.prototype.valueOf()
, die sich selbst zurückgibt.
Funktion
- Die
arity
-Eigenschaft von Funktionen ist überholt. Verwenden Sie stattdessenlength
.
Objekt
Eigenschaft | Beschreibung | Alternative |
---|---|---|
__count__ |
Gibt die Anzahl der aufzählbaren Eigenschaften direkt auf einem benutzerdefinierten Objekt zurück. | Object.keys() |
__parent__ |
Zeigt auf den Kontext eines Objekts. | Keine direkte Ersatz |
__iterator__ |
Wird mit Legacy-Iteratoren verwendet. | Symbol.iterator und die neuen Iterationsprotokolle |
__noSuchMethod__ |
Eine Methode, die aufgerufen wird, wenn eine nicht existierende Eigenschaft als Methode aufgerufen wird. | Proxy |
Object.prototype.eval() |
Führt einen JavaScript-Code-String im Kontext des spezifizierten Objekts aus. | Keine direkte Ersatz |
Object.observe() |
Asynchrones Beobachten der Änderungen an einem Objekt. | Proxy |
Object.unobserve() |
Entfernt Beobachter. | Proxy |
Object.getNotifier() |
Erstellt ein Benachrichtigungsobjekt, das es ermöglicht, eine synthetische Änderung zu erzeugen, die mit Object.observe() beobachtbar ist. |
Keine direkte Ersatz |
Object.prototype.watch() |
Hängt einen Callback-Handler an eine Eigenschaft an, der aufgerufen wird, wenn die Eigenschaft zugewiesen wird. | Proxy |
Object.prototype.unwatch() |
Entfernt Watch-Handler von einer Eigenschaft. | Proxy |
String
- Nicht-standardisierte generische String-Methoden wie
String.slice(myStr, 0, 12)
,String.replace(myStr, /\./g, "!")
, etc. wurden in Firefox 1.5 (JavaScript 1.6) eingeführt, in Firefox 53 als veraltet deklariert und in Firefox 68 entfernt. Sie können Methoden aufString.prototype
in Verbindung mitFunction.call
verwenden. String.prototype.quote
wurde aus Firefox 37 entfernt.- Nicht-standardisierte
flags
-Parameter inString.prototype.search
,String.prototype.match
, undString.prototype.replace
sind überholt.
WeakMap
WeakMap.prototype.clear()
wurde in Firefox 20 hinzugefügt und in Firefox 46 entfernt. Es ist nicht möglich, alle Schlüssel in einerWeakMap
zu durchlaufen.
Datum
Date.prototype.toLocaleFormat()
, das eine Formatzeichenkette im gleichen Format wie die von derstrftime()
-Funktion in C erwartete verwendete, ist überholt. Verwenden SietoLocaleString()
oderIntl.DateTimeFormat
stattdessen.
Array
- Nicht-standardisierte generische Array-Methoden wie
Array.slice(myArr, 0, 12)
,Array.forEach(myArr, myFn)
, etc. wurden in Firefox 1.5 (JavaScript 1.6) eingeführt, in Firefox 68 als veraltet deklariert und in Firefox 71 entfernt. Sie können Methoden aufArray.prototype
in Verbindung mitFunction.call
verwenden.
Number
Number.toInteger()
ist überholt. Verwenden SieMath.floor
,Math.round
oder andere Methoden stattdessen.
Proxy
Proxy.create
undProxy.createFunction
sind überholt. Verwenden Sie denProxy()
-Konstruktor stattdessen.- Die folgenden Fallen sind überholt:
hasOwn
(Bug 980565, Firefox 33).getEnumerablePropertyKeys
(Bug 783829, Firefox 37)getOwnPropertyNames
(Bug 1007334, Firefox 33)keys
(Bug 1007334, Firefox 33)
ParallelArray
ParallelArray
ist überholt.
Anweisungen
for each...in
ist überholt. Verwenden Siefor...of
stattdessen.- Let-Blocks und Let-Ausdrücke sind überholt.
- Ausdrucksschließungen (
function () 1
als Kurzform fürfunction () { return 1; }
) sind überholt. Verwenden Sie reguläreFunktionen
oder Pfeilfunktionen stattdessen.
Erwerb von Quelltext
Die toSource()
-Methoden von Arrays, Zahlen, Strings, etc. und die globale uneval()
-Funktion sind überholt. Verwenden Sie toString()
oder schreiben Sie Ihre eigene Serialisierungsmethode stattdessen.
Legacy-Generator und -Iterator
Legacy-Generator-Funktionsanweisungen und Legacy-Generator-Funktionsausdrücke sind entfernt. Die Legacy-Generator-Funktionssyntax verwendet das Schlüsselwort function
, das automatisch zu einer Generator-Funktion wird, wenn es im Körper eine oder mehrere yield
-Ausdrücke gibt — dies ist jetzt ein Syntaxfehler. Verwenden Sie stattdessen function*
-Anweisungen und function*
-Ausdrücke.
Array-Comprehensions und Generator-Comprehensions sind entfernt.
// Legacy array comprehensions
[for (x of iterable) x]
[for (x of iterable) if (condition) x]
[for (x of iterable) for (y of iterable) x + y]
// Legacy generator comprehensions
(for (x of iterable) x)
(for (x of iterable) if (condition) x)
(for (x of iterable) for (y of iterable) x + y)
Firefox implementierte vor Version 26 ein anderes Iterator-Protokoll, das dem standardmäßigen Iterator-Protokoll ähnlich ist. Ein Objekt ist ein Legacy-Iterator, wenn es eine next()
-Methode implementiert, die bei jedem Aufruf einen Wert erzeugt und ein StopIteration
-Objekt am Ende der Iteration wirft. Dieses Legacy-Iterator-Protokoll unterscheidet sich vom standardmäßigen Iterator-Protokoll:
- Der Wert wurde direkt als Rückgabewert von Aufrufen an
next()
zurückgegeben, anstatt dervalue
-Eigenschaft desIteratorResult
-Objekts. - Die Beendigung der Iteration wurde durch das Werfen eines
StopIteration
-Objekts ausgedrückt, anstelle derdone
-Eigenschaft desIteratorResult
-Objekts.
Dieses Feature, zusammen mit der globalen StopIteration
-Funktion, wurde in Firefox 58+ entfernt. Für zukünftige Verwendungszwecke sollten Sie die Verwendung von for...of
Schleifen und dem Iterator-Protokoll in Betracht ziehen.
Scharfe Variablen
Scharfe Variablen sind überholt. Um zirkuläre Strukturen zu schaffen, verwenden Sie stattdessen temporäre Variablen.